#include "headers/Disco.h"
#include "headers/Tracker.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int offset_ultima_pagina_gravada_disc = 0; //Offset da �ltima p�gina gravada em disco.

char* disc_LerPagina(int offset, char* path){
	FILE *arquivo;
	arquivo = fopen(path, "r+");

	int tamanhoLinha = TAMANHO_PAGINA +1; //+1 do \0 da string
	char* paginaLinha = (char*)malloc(tamanhoLinha);


	offset = ((offset) * (TAMANHO_PAGINA + 1)); // +2 no fim para Windows. Tirar +2 para Linux


	fseek(arquivo, offset, SEEK_SET);

	fgets(paginaLinha, tamanhoLinha, arquivo);

/*	int tamanhoFinal = strlen(paginaLinha) - 1;

	char* paginaLinhaFinal = (char*)malloc(tamanhoFinal);

	memcpy(paginaLinhaFinal, paginaLinha, tamanhoFinal);*/

	fclose(arquivo);
	return paginaLinha;
}

void disc_lerArquivo(Pagina* pagina, FILE* arquivo){
	int tamanhoLinha = TAMANHO_PAGINA;
	char* paginaLinhaTemp = (char*)malloc(tamanhoLinha);

	fgets(paginaLinhaTemp, tamanhoLinha, arquivo);

	char* line = (char*)malloc(TAMANHO_CONTEUDO);

	char* header;
	const char* search = ";";

	header = strtok(paginaLinhaTemp, search);
	line = strtok(NULL, search);

	pagina->id = atoi(header);
	strcpy(pagina->conteudo, line);

}

void disc_gravarPagina(Pagina* pagina) {
	FILE *arquivo;
	arquivo = fopen("SSD.txt", "a+");

	if (arquivo) {
		fprintf(arquivo, "%.6x;%s\n", pagina->id, pagina->conteudo);

		trac_AtualizarPagina(pagina->id, 'D', offset_ultima_pagina_gravada_disc);

		offset_ultima_pagina_gravada_disc = (offset_ultima_pagina_gravada_disc + TAMANHO_PAGINA + 2);//+2 do \n.

	}

	fclose(arquivo);

}



void disc_gravarPagina_LRU(Pagina* pagina) {
	FILE *arquivo;
	arquivo = fopen("SSD.txt", "a+");

	if (arquivo) {
		fprintf(arquivo, "%.4x;%s\n", pagina->id, pagina->conteudo);
	}
	fclose(arquivo);

}


void disc_gravarPaginaTemp(Pagina* pagina) {
	FILE *arquivo;
	arquivo = fopen("SSD.txt", "a+");

	if (arquivo) {
		fprintf(arquivo, "%.4x;%s\n", pagina->id, pagina->conteudo);
	}
	fclose(arquivo);

}



void limparArquivoTemporario() {
	FILE *arquivo;
	arquivo = fopen("SSD.txt", "w");
	fclose(arquivo);
}
